package com.pai4j.connect.websocket.interceptor;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;

import java.util.Map;

/**
 * ChatWebSocketEndPointServletInterceptor类实现了HandshakeInterceptor接口，
 * 用于在WebSocket握手过程中拦截请求，以实现自定义逻辑
 */
public class ChatWebSocketEndPointServletInterceptor implements HandshakeInterceptor {

    /**
     * 在握手前执行的方法
     * 该方法用于解析请求路径，提取出bizCode和userId，并将其存储到WebSocket会话的属性中
     *
     * @param request ServerHttpRequest对象，包含客户端请求的信息
     * @param response ServerHttpResponse对象，包含服务器响应的信息
     * @param wsHandler WebSocketHandler对象，表示处理WebSocket消息的处理器
     * @param attributes Map<String, Object>对象，表示WebSocket会话的属性
     * @return boolean值，表示是否继续执行握手过程 true表示继续，false表示中断
     * @throws Exception 如果方法抛出异常，则握手过程会被中断
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        // 获取请求路径
        String path = request.getURI().getPath();
        // 解析路径，提取bizCode和userId
        String bizCode = path.split("/")[4];
        String userId = path.split("/")[5];
        // 将bizCode、userId存储到session属性中
        attributes.put("bizCode", bizCode);
        attributes.put("userId", userId);
        return true;
    }

    /**
     * 在握手后执行的方法
     * 该方法用于处理握手完成后的逻辑
     *
     * @param request ServerHttpRequest对象，包含客户端请求的信息
     * @param response ServerHttpResponse对象，包含服务器响应的信息
     * @param wsHandler WebSocketHandler对象，表示处理WebSocket消息的处理器
     * @param exception Exception对象，表示握手过程中发生的异常（如果有）
     */
    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
        // 在这里处理握手完成后的逻辑
    }
}

